Skip to content

Commit 5f456e2

Browse files
authored
Merge pull request #6557 from akatsoulas/optimize-email-normalization
Optmize email normalization
2 parents fe11b11 + 98c4222 commit 5f456e2

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

kitsune/sumo/email_utils.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from post_office.settings import get_override_recipients
1414
from premailer import transform
1515

16-
1716
log = logging.getLogger("k.email")
1817

1918

@@ -31,34 +30,28 @@ def normalize_gmail(email: str) -> str:
3130
return email
3231

3332

34-
def is_valid_email(email: str) -> bool:
35-
"""
36-
Returns True if the given email address is valid, False otherwise.
37-
"""
38-
try:
39-
validate_email(normalize_gmail(email))
40-
except ValidationError:
41-
return False
42-
return True
43-
44-
4533
def send_messages(messages):
4634
"""Sends a bunch of email messages."""
4735
if not messages:
4836
return
4937

50-
# Only send each message to its valid recipients,
51-
# excluding messages without any valid recipients.
52-
cleaned_messages = []
38+
valid_messages = []
5339
for message in messages:
54-
# Remove invalid emails and normalize gmails.
55-
cleaned_to = [normalize_gmail(email) for email in message.to if is_valid_email(email)]
56-
if cleaned_to:
57-
message.to = cleaned_to
58-
cleaned_messages.append(message)
40+
valid_emails = []
41+
for email in message.to:
42+
normalized_email = normalize_gmail(email)
43+
try:
44+
validate_email(normalized_email)
45+
valid_emails.append(normalized_email)
46+
except ValidationError:
47+
pass
48+
49+
if valid_emails:
50+
message.to = valid_emails
51+
valid_messages.append(message)
5952

6053
with mail.get_connection(fail_silently=True) as conn:
61-
conn.send_messages(cleaned_messages)
54+
conn.send_messages(valid_messages)
6255

6356

6457
def safe_translation(f):

kitsune/sumo/tests/test_email_utils.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from django.conf import settings
44
from django.contrib.sites.models import Site
55
from django.core.mail import EmailMultiAlternatives
6-
from django.utils.functional import lazy
76
from django.utils import translation
7+
from django.utils.functional import lazy
88
from django.utils.translation import get_language
99

1010
from kitsune.sumo.email_utils import emails_with_users_and_watches, safe_translation, send_messages
@@ -156,3 +156,20 @@ def test_send_messages(self, mock_mail):
156156
self.assertEqual(messages[1].to, ["georgeharrison@gmail.com"])
157157
self.assertEqual(messages[2].to, ["paulmccartney@gmail.com"])
158158
self.assertEqual(messages[3].to, ["ringo@beatles.com", "george@beatles.com"])
159+
160+
@patch("kitsune.sumo.email_utils.mail")
161+
def test_send_messages_with_invalid_email(self, mock_mail):
162+
from_email = "notifications@support.mozilla.org"
163+
messages = [
164+
EmailMultiAlternatives(
165+
"Test",
166+
"Testing",
167+
from_email,
168+
["valid@example.com", "invalid@email", "another.valid@example.com"],
169+
),
170+
]
171+
send_messages(messages)
172+
send_messages_mock = mock_mail.get_connection().__enter__().send_messages
173+
send_messages_mock.assert_called_once_with(messages)
174+
# Check that the invalid email was removed
175+
self.assertEqual(messages[0].to, ["valid@example.com", "another.valid@example.com"])

0 commit comments

Comments
 (0)